/*
* 将数组里面的每个数 进行平方的操作
* */

// 命令式编程 : 过程
let array = [1, 2, 3, 4];
for (let i = 0; i < array.length; i++) {
  array[i] = Math.pow(array[i], 2);
}
console.log(array);

// 函数式编程
console.log([1, 2, 3, 4].map(num => Math.pow(num, 2)));
// 把逻辑 编写成函数 定义好输入和输出 只注重结果

// 纯函数
// 函数 : 纯洁  不变性 : 参数和结果 无状态性 : 不会影响别的值活状态
// 就是纯函数
let double = value => value * 2; // 34
// 特性 :
// 1. 函数内部传入指定的值 就会返回确定的唯一的值
// 2. 不会造成超出作用域的变化 不应该包含全局作用域 也不影响引用数据类型

// JSON.parse(JSON.stringify(obj));
// 优势:
// 更方便 : 单元测试
// test('测试double(2) 等于4', () => {
//   expect(double(2).toBe(4))
// });


// 高阶函数  : 传递的是函数 || 返回的是函数
// 高阶组件  : 传递的是组件&&返回的是组件

[1, 2, 3].forEach((item, index, arr) => {
  console.log(item, index, arr);
});

Array.prototype.myForEach = function (fn) {
  // 谁代表[1,2,3] this
  // 谁代表回调 fn
  let arr = this;
  for (let i = 0; i < arr.length; i++) {
    fn(arr[i], i, arr)
  }
};
Array.prototype.myMap = function (fn) {
  // 谁代表[1,2,3] this
  // 谁代表回调 fn
  let arr = this;
  const pushArr = [];
  for (let i = 0; i < arr.length; i++) {
    pushArr.push(fn(arr[i], i, arr));
  }
  return pushArr;
};


[5, 6, 7, 8].myForEach((item, index, arr) => {
  console.log(arr);
});

const res = [5, 6, 7, 8].myMap((item, index, arr) => {
  return null;
});
console.log(res);
// 柯里化函数

// 模拟 filter every find findIndex flat reduce includes
// 柯里化函数
